<?php
class CtbClass {

      var $file;      
      var $index;   

    //建立一个文件并写入输入 
      function null_write($new) 
      { 
            $f=fopen($this->file,"w");      
            flock($f,LOCK_EX); 
            fputs($f,$new);      
            fclose($f);  
			return true; 
      } 
      // 添加数据记录到文件末端 
      function add_write($new) {       
            $f=fopen($this->file,"a");      
            flock($f,LOCK_EX); 
            fputs($f,"|".$new);       
            fclose($f);   
      }   
      // 配合readfile()的返回一起使用,把一行数据转换为一维数组 
      function make_array($line) { 
            $array = explode("x0E",$line); 
            return $array; 
      } 
       
      //把为一维数组转换一行数据 
      function join_array($line) { 
            $array = join("x0E",$line); 
            return $array; 
      } 
      // 返回数据文件的总行数 
      function getlines() { 
            $f=file($this->file);      
            return count($f);      
      } 
      // 返回下一行的数据记录(备用) 
      function next_line() { 
            $this->index=$this->index++;      
            return $this->get();      
      }

      // 返回上一行的数据记录(备用) 
      function prev_line() { 
            $this->index=$this->index--;      
            return $this->get();      
      }    
      // 返回当前行的数据记录数据较小 
      function get() { 
            $f=fopen($this->file,"r");      
            flock($f,LOCK_SH); 
            for($i=0;$i<=$this->index;$i++) { 
                  $rec=fgets($f,1024);      
            } 
            $line=explode("x0E",$rec); 
            fclose($f); 
            return $line;      
      }    
      // 返回当前行的数据记录数据较大 
      function get_big_file() { 
            $f=fopen($this->file,"r");      
            flock($f,LOCK_SH); 
            for($i=0;$i<=$this->index;$i++) { 
                  $rec=fgets($f,1024*5);      
            } 
            $line=explode("x0E",$rec); 
            fclose($f); 
            return $line;      
      }    
      // 打开数据文件---以一维数组返回文件内容 
      function read_file() { 
            if (file_exists($this->file)) { 
                  $line =file($this->file); 
            } 
            return $line; 
      } 
      // 打开数据文件---以二维数组返回文件内容 
      function openFile() { 
            if (file_exists($this->file)) { 
                  $f =file($this->file); 
                  $lines = array(); 
                  foreach ($f as $rawline) { 
                        $tmpline = explode("x0E",$rawline); 
                        array_push($lines, $tmpline); 
                  } 
            } 
            return $lines; 
      } 
      // 传入一个数组,合并成一行数据,重写整个文件 
      function overwrite($array){ 
            $newline = implode("x0E",$array);        
            $f = fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newline); 
            fclose($f); 
      } 
   
      // 添加一行数据记录到文件末端 
      function add_line($array,$check_n=1) {    
            $s=implode("x0E",$array);      
            $f=fopen($this->file,"a");      
            flock($f,LOCK_EX); 
            fputs($f,$s);      
            if ($check_n==1) fputs($f,"n");      
            fclose($f);   
      }     

      // 插入一行数据记录到文件最前面 
      function insert_line($array) { 
            $newfile = implode("x0E",$array); 
            $f = fopen($this->file,"r"); 
            flock($f,LOCK_SH); 
            while ($line = fgets($f,1024)) { 
                  $newfile .= $line; 
            } 
            fclose($f); 
            $f = fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newfile); 
            fclose($f); 
      }

      // 更新所有符合条件的数据记录,适用于每行字节数据较大的情况 
      function update($column,$query_string,$update_array) { 
            $update_string = implode("x0E",$update_array);     
            $newfile = "";        
            $fc=file($this->file); 
            $f=fopen($this->file,"r"); 
            flock($f,LOCK_SH); 
            for ($i=0;$i<count($fc);$i++) { 
                  $list = explode("x0E",$fc[$i]); 
                  if ($list[$column] != $query_string) { 
                        $newfile = $newfile.chop($fc[$i])."n"; 
                  } else { 
                        $newfile = $newfile.$update_string; 
                  } 
            } 
            fclose($f); 
            $f=fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newfile); 
            fclose($f); 
      }

      // 更新所有符合条件的数据记录,适用于每行字节数据较小的情况 
      function update2($column,$query_string,$update_array) { 
            $newline = implode("x0E",$update_array);     
            $newfile = ""; 
            $f = fopen($this->file,"r"); 
            flock($f,LOCK_SH); 
            while ($line = fgets($f,1024)) { 
                  $tmpLine = explode("x0E",$line); 
                  if ($tmpLine[$column] == $query_string) { 
                        $newfile .= $newline; 
                  } else { 
                        $newfile .= $line; 
                  } 
            } 
            fclose($f); 
            $f = fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newfile); 
            fclose($f); 
      }

      // 删除所有符合条件的数据记录,适用于每行字节数据较大的情况 
      function delete($column,$query_string) { 
            $newfile = "";        
            $fc=file($this->file); 
            $f=fopen($this->file,"r"); 
            flock($f,LOCK_SH); 
            for ($i=0;$i<count($fc);$i++) { 
                  $list = explode("x0E",$fc[$i]); 
                  if ($list[$column] != $query_string) { 
                        $newfile = $newfile.chop($fc[$i])."n"; 
                  } 
            } 
            fclose($f); 
            $f=fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newfile); 
            fclose($f); 
      }     

      // 删除所有符合条件的数据记录,适用于每行字节数据较小的情况 
      function delete2($column,$query_string){    
            $newfile = ""; 
            $f = fopen($this->file,"r"); 
            flock($f,LOCK_SH); 
            while ($line = fgets($f,1024)) { 
                  $tmpLine = explode("x0E",$line); 
                  if ($tmpLine[$column] != $query_string) { 
                        $newfile .= $line; 
                  } 
            } 
            fclose($f); 
            $f = fopen($this->file,"w"); 
            flock($f,LOCK_EX); 
            fputs($f,$newfile); 
            fclose($f); 
      }

    //取得一个文件里某个字段的最大值 
      function get_max_value($column) { 
            $tlines = file($this->file); 
            for ($i=0;$i<=count($tlines);$i++) { 
                  $line=explode("x0E",$tlines[$i]); 
                  $get_value[]=$line[$column]; 
            } 
        $get_max_value = max($get_value); 
            return $get_max_value; 
      }


      // 根据数据文件的某个字段是否包含$query_string进行查询,      //以二维数组返回所有符合条件的数据 
      function select($column, $query_string) { 
            $tline = $this->openfile(); 
            $lines = array(); 
            foreach ($tline as $line) { 
                  if ($line[$column] == $query_string) { 
                        array_push($lines, $line); 
                  } 
            }

            return $lines; 
      }

      // 功能与function select()一样,速度可能略有提升 
      function select2($column, $query_string) { 
            if (file_exists($this->file)) { 
                  $tline = $this->read_file(); 
                  foreach ($tline as $tmpLine) { 
                        $line = $this->make_array($tmpLine); 
                        if ($line[$column] == $query_string) { 
                              $lines[]=$tmpLine; 
                        } 
                  } 
            }

            return $lines; 
      }

      // 根据数据文件的某个字段是否包含$query_string进行查询,      //以一维数组返回第一个符合条件的数据 
      function select_line($column, $query_string) { 
            $tline = $this->read_file(); 
            foreach ($tline as $tmpLine) { 
                  $line = $this->make_array($tmpLine); 
                  if ($line[$column] == $query_string) { 
                    return $line; 
                        break; 
                  } 
            } 
      } 
      // select next/prev line(next_prev ==> 1/next, 2/prev) by cx 
      function select_next_prev_line($column, $query_string, $next_prev) { 
            $tline = $this->read_file(); 
            $line_key_end = count($tline) - 1; 
            $line_key = -1; 
            foreach ($tline as $tmpLine) { 
                  $line_key++; 
                  $line = $this->make_array($tmpLine); 
                  if ($next_prev == 1) { // next? 
                        if ($line[$column] == $query_string) { 
                              if ($line_key == 0) { 
                                    return 0; 
                              } else { 
                                    $line_key_up = $line_key - 1; 
                                    return $up_line; 
                              } 
                        } else { 
                              $up_line = $line; 
                        } 
                  } elseif ($next_prev == 2) { // prev? 
                        if ($line[$column] == $query_string) { 
                              if ($line_key == $line_key_end) { 
                                    return 0; 
                              } else { 
                                    $line_key_down = $line_key + 1; 
                                    break; 
                              } 
                        } 
                  } else { 
                        return 0; 
                  } 
            } 
            $down_line = $this->make_array($tline[$line_key_down]); 
            return $down_line; 
      }
      
}

?>